// 处理data数据是数组的情况

// 重写数组
// 1、获取原来的数组方法，通过原型链的方式
let oldArrayProtoMethods = Array.prototype

// 2、继承原来的方法,在js中通过对象的方式进行继承，ArrayMethods将原来数组中的所有方法进行劫持
export let ArrayMethods = Object.create(oldArrayProtoMethods)

// 3、劫持数组中的通用的方法
let methods = [
    "push",
    "pop",
    "unshift",
    "shift",
    "splice"
]

// 遍历这些方法

methods.forEach(item=>{
    ArrayMethods[item] = function(...args){  // list:[]  list.push()  将方法重新定义一个函数,用户可能传递参数过来 args是一个伪数组

        // console.log('劫持数组');

        // 执行他原来的方法,原始的追加方式
        let result = oldArrayProtoMethods[item].apply(this,args) // 进行了一个函数劫持，这个this的指向就是我们执行的那一个数组


        // 问题  数组追加对象的情况   arr
        let inserted
        switch(item){
            case 'push':
            case 'unshift':
                inserted = args
                break
            case 'splice':
                inserted = args.splice(2)  // 可以使用这种方式来追加元素  arr.splice(0,2,{a:6})
                break
        }
        // console.log(inserted);
        let ob = this.__ob__  // 这里的this指的是被处理的数组对象，通过这种方法获取到处理数组对象的方法
        if(inserted){
            ob.observeArray(inserted)  //对添加的对象进行劫持
        }
        return result
    }
})